From 864fdbcd4d2382752c101b92c50f3bf2be3ff0c1 Mon Sep 17 00:00:00 2001 From: "arun.sharma@intel.com[kaf24]" Date: Thu, 24 Feb 2005 09:39:31 +0000 Subject: [PATCH] bitkeeper revision 1.1236.1.10 (421da0d32W6mm78NfqVauwQT_ZO1dQ) [PATCH] mmio_addr.patch Use 1:1 page table to figure out if a particular physical address belongs to MMIO range or not. Signed-off-by: Xin B Li Signed-off-by: Chengyuan Li Signed-off-by: Arun Sharma Index: trunk/tools/libxc/xc_vmx_build.c =================================================================== --- tools/libxc/xc_vmx_build.c | 39 ++++++++++++++++++++++++++++++ xen/arch/x86/vmx.c | 1 + xen/include/asm-x86/shadow.h | 3 ++- xen/include/asm-x86/vmx_platform.h | 10 +------- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/tools/libxc/xc_vmx_build.c b/tools/libxc/xc_vmx_build.c index c286febdf0..3bb4d4fde8 100644 --- a/tools/libxc/xc_vmx_build.c +++ b/tools/libxc/xc_vmx_build.c @@ -108,6 +108,44 @@ static void build_e820map(struct mem_map *mem_mapp, unsigned long mem_size) mem_mapp->nr_map = nr_map; } +static void zap_mmio_range(int xc_handle, u32 dom, + l2_pgentry_t *vl2tab, + unsigned long mmio_range_start, + unsigned long mmio_range_size) +{ + unsigned long mmio_addr; + unsigned long mmio_range_end = mmio_range_start + mmio_range_size; + unsigned long vl2e; + l1_pgentry_t *vl1tab; + + mmio_addr = mmio_range_start & PAGE_MASK; + for (; mmio_addr < mmio_range_end; mmio_addr += PAGE_SIZE) { + vl2e = vl2tab[l2_table_offset(mmio_addr)]; + vl1tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, + PROT_READ|PROT_WRITE, vl2e >> PAGE_SHIFT); + vl1tab[l1_table_offset(mmio_addr)] = 0; + munmap(vl1tab, PAGE_SIZE); + } +} + +static void zap_mmio_ranges(int xc_handle, u32 dom, + unsigned long l2tab, + struct mem_map *mem_mapp) +{ + int i; + l2_pgentry_t *vl2tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, + PROT_READ|PROT_WRITE, + l2tab >> PAGE_SHIFT); + for (i = 0; i < mem_mapp->nr_map; i++) { + if ((mem_mapp->map[i].type == E820_IO) + && (mem_mapp->map[i].caching_attr == MEMMAP_UC)) + zap_mmio_range(xc_handle, dom, + vl2tab, mem_mapp->map[i].addr, + mem_mapp->map[i].size); + } + munmap(vl2tab, PAGE_SIZE); +} + static int setup_guest(int xc_handle, u32 dom, int memsize, char *image, unsigned long image_size, @@ -355,6 +393,7 @@ static int setup_guest(int xc_handle, /* memsize is in megabytes */ build_e820map(mem_mapp, memsize << 20); + zap_mmio_ranges(xc_handle, dom, l2tab, mem_mapp); boot_paramsp->e820_map_nr = mem_mapp->nr_map; for (i=0; inr_map; i++) { boot_paramsp->e820_map[i].addr = mem_mapp->map[i].addr; diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c index 4b47e52c2c..a30423bab9 100644 --- a/xen/arch/x86/vmx.c +++ b/xen/arch/x86/vmx.c @@ -135,6 +135,7 @@ static int vmx_do_page_fault(unsigned long va, struct xen_regs *regs) return 0; gpa = (gpte & PAGE_MASK) + (va & ~PAGE_MASK); + /* Use 1:1 page table to identify MMIO address space */ if (mmio_space(gpa)) handle_mmio(va, gpa); diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h index f29945142a..191cf3dbe1 100644 --- a/xen/include/asm-x86/shadow.h +++ b/xen/include/asm-x86/shadow.h @@ -279,7 +279,8 @@ static inline void l1pte_propagate_from_guest( unsigned long old_spte = spte; #endif - if ( shadow_mode_external(d) && mmio_space(gpte & 0xFFFFF000) ) { + /* Use 1:1 page table to identify MMIO address space */ + if ( shadow_mode_external(d) && mmio_space(gpte) ) { *spte_p = 0; return; } diff --git a/xen/include/asm-x86/vmx_platform.h b/xen/include/asm-x86/vmx_platform.h index 83cbb59e6f..5ecb782c7e 100644 --- a/xen/include/asm-x86/vmx_platform.h +++ b/xen/include/asm-x86/vmx_platform.h @@ -68,8 +68,6 @@ struct instruction { __u32 flags; // }; -#define VGA_SPACE_START 0xA0000 -#define VGA_SPACE_END 0xC0000 #define MAX_INST_LEN 32 struct mi_per_cpu_info @@ -89,12 +87,6 @@ struct virutal_platform_def { extern void handle_mmio(unsigned long, unsigned long); extern int vmx_setup_platform(struct exec_domain *, execution_context_t *); -static inline int mmio_space(unsigned long gpa) -{ - if (gpa >= VGA_SPACE_START && gpa < VGA_SPACE_END) { - return 1; - } - return 0; -} +#define mmio_space(gpa) (!phys_to_machine_mapping((gpa) >> PAGE_SHIFT)) #endif -- 2.30.2